'''
Created on 24/08/2010

@author: kivson
'''
import array
import operator

try: 
    import numpy
    print "Usando Numpy"
    TEM_NUMPY = True
except:
    
    TEM_NUMPY = False



class Cripter(object):
    
    '''
    Classe que implemtenta e organiza os metos de criptografia pro sistema.
    '''
    INVERTE_BITS = 0
    
    def __init__(self, algoritmo=None):
        '''
        Constructor
        '''
        if TEM_NUMPY:
            self.inverteBits = self.inverteBits_numpy
        else:
            self.inverteBits = self.inverteBits_normal
            
        if not algoritmo:
            self.algoritmo = self.INVERTE_BITS
        else:
            self.algoritmo = algoritmo
            
    def inverteBits_normal(self, dados):
        #print "usando normal"
        '''
        inversao de bits com o operados ~
        dados : um list-like de bytes (caracteres)
        '''
        dad = array.array('b',dados)
        
        resp= array.array('b', map(operator.invert,dad))
        
        return resp.tostring()
    
    
    def inverteBits_numpy(self, dados):
        '''
        inversao de bits com o operados ~
        dados : um list-like de bytes (caracteres)
        '''
        #print "usando numpy"
        dad = numpy.fromstring(dados, dtype=numpy.byte)
        resp= numpy.invert(dad)
        
        return resp.tostring()
    
    def criptografa(self, dados):
        if self.algoritmo == self.INVERTE_BITS:
            return self.inverteBits(dados)